package com.webserver.servlet;

import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.FileTemplateResolver;

import com.webserver.http.HttpContext;
import com.webserver.http.HttpRequest;
import com.webserver.http.HttpResponse;

/**
 * 使用thymeleaf与将user.dat中的文件数据与userList.html页面结合，生成含有user.dat
 * 文件数据的页面，而页面的样子是userList.html的结构。
 * @author pc
 *
 */
public class UserListServlet extends HttpServlet{
	public void service(HttpRequest request,HttpResponse response) {
		System.out.println("UserListServlet:开始显示所有用户");
		try (
			RandomAccessFile raf = new RandomAccessFile("user.dat","r");	
		){
			List<Map<String,String>> list = new ArrayList<>();
			for(int i=0;i<raf.length()/100;i++) {
				//用一个Map保存一个用户信息，key是属性名，value是属性对应的值
				Map<String,String> user = new HashMap<>();
				byte[] data = new byte[32];
				raf.read(data);
				String username = new String(data,"UTF-8").trim();	
				user.put("username", username);
				raf.read(data);
				String password = new String(data,"UTF-8").trim();	
				user.put("password", password);
				raf.read(data);
				String nickname = new String(data,"UTF-8").trim();	
				user.put("nickname", nickname);
				int age = raf.readInt();
				user.put("age", age+"");
				System.out.println(user);
				list.add(user);//将每一个Map(一个用户的信息)存入list集合
			}	
			/*
			 * 使用thymeleaf将这个List集合中的用户信息绑定到userList.html页面上
			 * 生成一个含有用户信息的页面数据
			 */
			//这个类用来保存所用希望在页面显示的数据，可以先简单理解为结构是一个Map
			Context ctx = new Context();
			ctx.setVariable("users", list);//存入一个数据，类似Map的put方法
			
			//加载数据要显示在哪个页面上(加载页面模板)
			FileTemplateResolver fr = new FileTemplateResolver();
			fr.setTemplateMode("html");//指定模板页面的格式(这里是html页面)
			fr.setCharacterEncoding("UTF-8");//指定该模板页面的字符集
			//创建模板引擎，用于结合模板页面和Context中的数据生成含有该数据的页面代码
			TemplateEngine te = new TemplateEngine();
			//设置模板解释器后，引擎就能理解如何读取模板页面
			te.setTemplateResolver(fr);
			/*
			 * 处理,加载模板并将context中的数据生成到模板页面并返回对应的代码
			 * 参数1:模板页面的路径
			 * 参数2:要在该页面上显示的数据(Context对象)
			 */
			String html = te.process("./webapps/myweb/userList.html", ctx);
			System.out.println(html);
			
			byte[] data = html.getBytes("UTF-8");
			response.setContent(data);
			response.setHeader("Content-Type", HttpContext.getMimeType("html"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("UserListServlet:显示所有用户完毕");
	}
}











